@echo off
chcp 65001 >nul 2>&1
setlocal enabledelayedexpansion

echo ========================================
echo      招聘系统后端环境检查脚本
echo ========================================
echo 版本: 2.0.0
echo 设计: SpringBoot启动问题诊断与解决方案
echo ========================================
echo.

set "error_count=0"
set "warning_count=0"
set "check_count=8"

:: 创建日志文件
set "log_file=logs\environment-check-%date:~0,4%%date:~5,2%%date:~8,2%-%time:~0,2%%time:~3,2%%time:~6,2%.log"
if not exist "logs" mkdir "logs"
echo [%date% %time%] 开始环境检查 > "%log_file%"

:: 检查Java版本
echo [1/%check_count%] 检查Java环境...
echo [%date% %time%] 检查Java环境 >> "%log_file%"
java -version >nul 2>&1
if %errorlevel% neq 0 (
    echo ❌ Java未正确安装或未添加到PATH
    echo [ERROR] Java未正确安装或未添加到PATH >> "%log_file%"
    set /a error_count+=1
    goto :java_error
) else (
    echo ✅ Java环境正常
    for /f "tokens=*" %%a in ('java -version 2^>^&1 ^| findstr "version"') do (
        echo    %%a
        echo [INFO] %%a >> "%log_file%"
    )
    
    :: 检查Java版本是否符合要求（17+）
    for /f "tokens=3 delims= " %%a in ('java -version 2^>^&1 ^| findstr "version"') do (
        set java_ver=%%a
        set java_ver=!java_ver:"=!
        for /f "tokens=1 delims=." %%b in ("!java_ver!") do (
            if %%b lss 17 (
                echo ⚠️  警告: Java版本过低，建议使用Java 17或更高版本
                echo [WARN] Java版本过低: !java_ver! >> "%log_file%"
                set /a warning_count+=1
            )
        )
    )
)

:java_error

:: 检查Maven版本
echo.
echo [2/%check_count%] 检查Maven环境...
echo [%date% %time%] 检查Maven环境 >> "%log_file%"
mvn -version >nul 2>&1
if %errorlevel% neq 0 (
    echo ❌ Maven未正确安装或未添加到PATH
    echo [ERROR] Maven未正确安装或未添加到PATH >> "%log_file%"
    set /a error_count+=1
    goto :maven_error
) else (
    echo ✅ Maven环境正常
    for /f "tokens=*" %%a in ('mvn -version 2^>^&1 ^| findstr "Apache Maven"') do (
        echo    %%a
        echo [INFO] %%a >> "%log_file%"
    )
)

:maven_error

:: 检查MySQL服务
echo.
echo [3/%check_count%] 检查MySQL服务...
echo [%date% %time%] 检查MySQL服务 >> "%log_file%"
netstat -an | findstr ":3306" >nul 2>&1
if %errorlevel% neq 0 (
    echo ❌ MySQL服务未启动，端口3306未监听
    echo    请启动MySQL服务: net start mysql
    echo    或检查MySQL配置文件中的端口设置
    echo [ERROR] MySQL服务未启动，端口3306未监听 >> "%log_file%"
    set /a error_count+=1
) else (
    echo ✅ MySQL服务正常运行（端口3306）
    echo [INFO] MySQL服务正常运行（端口3306） >> "%log_file%"
    
    :: 尝试测试数据库连接
    echo    正在测试数据库连接...
    mysql -u root -p123456 -e "SELECT 1;" >nul 2>&1
    if %errorlevel% neq 0 (
        echo    ⚠️  数据库连接测试失败，请检查用户名密码
        echo [WARN] 数据库连接测试失败 >> "%log_file%"
        set /a warning_count+=1
    ) else (
        echo    ✅ 数据库连接测试成功
        echo [INFO] 数据库连接测试成功 >> "%log_file%"
    )
)

:: 检查Redis服务（可选）
echo.
echo [4/%check_count%] 检查Redis服务...
echo [%date% %time%] 检查Redis服务 >> "%log_file%"
netstat -an | findstr ":6379" >nul 2>&1
if %errorlevel% neq 0 (
    echo ⚠️  Redis服务未启动，系统将以无缓存模式运行
    echo    建议启动Redis服务以获得更好的性能
    echo    Windows: redis-server.exe
    echo    或使用Docker: docker run -d -p 6379:6379 redis
    echo [WARN] Redis服务未启动，系统将以无缓存模式运行 >> "%log_file%"
    set /a warning_count+=1
) else (
    echo ✅ Redis服务正常运行（端口6379）
    echo [INFO] Redis服务正常运行（端口6379） >> "%log_file%"
    
    :: 测试Redis连接
    echo    正在测试Redis连接...
    redis-cli ping >nul 2>&1
    if %errorlevel% neq 0 (
        echo    ⚠️  Redis连接测试失败
        echo [WARN] Redis连接测试失败 >> "%log_file%"
        set /a warning_count+=1
    ) else (
        echo    ✅ Redis连接测试成功
        echo [INFO] Redis连接测试成功 >> "%log_file%"
    )
)

:: 检查端口占用
echo.
echo [5/%check_count%] 检查应用端口...
echo [%date% %time%] 检查应用端口 >> "%log_file%"
netstat -an | findstr ":8080" >nul 2>&1
if %errorlevel% equ 0 (
    echo ❌ 端口8080已被占用
    echo    请停止占用端口8080的进程
    echo    占用端口的进程信息：
    netstat -ano | findstr ":8080"
    echo [ERROR] 端口8080已被占用 >> "%log_file%"
    netstat -ano | findstr ":8080" >> "%log_file%"
    set /a error_count+=1
) else (
    echo ✅ 端口8080可用
    echo [INFO] 端口8080可用 >> "%log_file%"
)

:: 检查项目依赖
echo.
echo [6/%check_count%] 检查项目依赖...
echo [%date% %time%] 检查项目依赖 >> "%log_file%"
if exist "backend\pom.xml" (
    echo ✅ 找到Maven项目配置文件
    echo [INFO] 找到Maven项目配置文件 >> "%log_file%"
    
    cd /d "backend"
    echo    正在验证Maven依赖...
    mvn dependency:resolve -q >nul 2>&1
    if %errorlevel% neq 0 (
        echo    ⚠️  Maven依赖解析可能存在问题
        echo    建议运行: mvn clean install
        echo [WARN] Maven依赖解析可能存在问题 >> "..\%log_file%"
        set /a warning_count+=1
    ) else (
        echo    ✅ Maven依赖验证成功
        echo [INFO] Maven依赖验证成功 >> "..\%log_file%"
    )
    cd ..
) else (
    echo ❌ 未找到Maven项目配置文件 (backend\pom.xml)
    echo [ERROR] 未找到Maven项目配置文件 >> "%log_file%"
    set /a error_count+=1
)

:: 检查配置文件
echo.
echo [7/%check_count%] 检查配置文件...
echo [%date% %time%] 检查配置文件 >> "%log_file%"
if exist "backend\src\main\resources\application.yml" (
    echo ✅ 找到主配置文件
    echo [INFO] 找到主配置文件 >> "%log_file%"
) else (
    echo ❌ 未找到主配置文件 application.yml
    echo [ERROR] 未找到主配置文件 >> "%log_file%"
    set /a error_count+=1
)

if exist "backend\src\main\resources\application-dev.yml" (
    echo ✅ 找到开发环境配置文件
    echo [INFO] 找到开发环境配置文件 >> "%log_file%"
) else (
    echo ⚠️  未找到开发环境配置文件 application-dev.yml
    echo [WARN] 未找到开发环境配置文件 >> "%log_file%"
    set /a warning_count+=1
)

:: 检查磁盘空间
echo.
echo [8/%check_count%] 检查磁盘空间...
echo [%date% %time%] 检查磁盘空间 >> "%log_file%"
for /f "tokens=3" %%a in ('dir /-c ^| findstr "bytes free"') do (
    set free_space=%%a
    set free_space=!free_space:,=!
    if !free_space! lss 1073741824 (
        echo ❌ 磁盘可用空间不足 (少于1GB)
        echo [ERROR] 磁盘可用空间不足 >> "%log_file%"
        set /a error_count+=1
    ) else (
        echo ✅ 磁盘空间充足
        echo [INFO] 磁盘空间充足 >> "%log_file%"
    )
)

:: 生成检查报告
echo.
echo ========================================
echo            环境检查报告
echo ========================================
echo 检查项目: %check_count%
echo 错误数量: %error_count%
echo 警告数量: %warning_count%
echo 日志文件: %log_file%
echo ========================================
echo.

echo [%date% %time%] 环境检查完成 >> "%log_file%"
echo [SUMMARY] 检查项目: %check_count%, 错误: %error_count%, 警告: %warning_count% >> "%log_file%"

if %error_count% gtr 0 (
    echo ❌ 环境检查发现 %error_count% 个严重问题，需要解决后才能启动应用
    echo 请查看上述错误信息和日志文件以获取详细信息
    echo.
    echo 常见解决方案：
    echo 1. 安装Java 17+: https://adoptium.net/
    echo 2. 安装Maven: https://maven.apache.org/download.cgi
    echo 3. 启动MySQL服务: net start mysql
    echo 4. 启动Redis服务（可选）: redis-server.exe
    echo 5. 检查端口占用: netstat -ano ^| findstr :8080
    echo.
    goto :error
) else if %warning_count% gtr 0 (
    echo ⚠️  环境检查发现 %warning_count% 个警告，建议处理后启动应用
    echo.
    set /p continue_with_warnings="是否忽略警告并继续启动？(y/n): "
    if /i "!continue_with_warnings!"=="n" (
        echo 请处理警告后重新运行检查
        goto :end
    )
) else (
    echo ✅ 环境检查完成，所有检查项目均正常！
)

echo.
echo ========================================

:: 询问是否启动应用
set /p start_app="是否立即启动后端服务？(y/n): "
if /i "%start_app%"=="y" (
    echo.
    echo 正在启动后端服务...
    echo 启动命令: mvn spring-boot:run -Dspring-boot.run.profiles=dev
    echo 应用地址: http://localhost:8080/api
    echo Swagger文档: http://localhost:8080/api/swagger-ui.html
    echo Druid监控: http://localhost:8080/api/druid
    echo.
    cd /d "%~dp0backend"
    echo [%date% %time%] 开始启动应用 >> "..\%log_file%"
    mvn spring-boot:run -Dspring-boot.run.profiles=dev
) else (
    echo.
    echo 环境检查完成，你可以手动启动应用：
    echo 1. 进入backend目录: cd backend
    echo 2. 运行启动命令: mvn spring-boot:run -Dspring-boot.run.profiles=dev
    echo 3. 或使用IDE直接运行 EmploymentApplication.java
)

goto :end

:error
echo.
echo ========================================
echo ❌ 环境检查失败，请解决上述问题后重试
echo ========================================
echo 详细日志已保存到: %log_file%
endlocal
exit /b 1

:end
echo.
if %error_count% equ 0 (
    echo ✅ 脚本执行完成
) else (
    echo ❌ 脚本执行完成，但发现问题
)
pause